﻿#pragma once
#include "MyHeader.h"

#ifndef MY_PICTURE_H
	#define MY_PICTURE_H

#include <opencv2/superres.hpp>
#include <opencv2/core/mat.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/dnn_superres.hpp>

namespace fs = std::filesystem;


class MyPicture {
public:
	MyPicture() = default;
	MyPicture(const std::string& filename);
	~MyPicture();
	inline void release_image();

	// 加载与保存图片
	bool check_image_exist(const std::string& filename);
	void load_image(const std::string& filename);
	void save_image(const std::string& filename);
	void compress_image(const std::string& filename, int quality); // 压缩图片并保存到指定文件

	// 图片处理
	void sharpen_image(float level = 1.0f); // 锐化图片
	void bilateral_filter_image(int d, double sigmaColor, double sigmaSpace); // 双边滤波去噪
	void non_local_filter_image(int h, int hForColorComponents, int templateWindowSize, int searchWindowSize); // 非局部均值去噪
	void equalization_image();  // 直方图均衡化图片
	void clahe_image(int clipLimit, int tileGridSize); // 对比度限制自适应直方图均衡化
	void median_blur_image(int ksize); // 中值滤波
	void gaussian_blur_image(int ksize, double sigmaX, double sigmaY); // 高斯模糊
	void morphology_operations_image(cv::MorphTypes op, cv::MorphShapes shape, int size); // 形态学操作
	void color_balance_image(double alpha, double beta, double gamma); // 图像的亮度、对比度和伽玛值
	void segment_image(); // 阈值化图像分割
	void edge_detection_canny_image(int threshold1, int threshold2); // Canny 边缘检测
	void inpaint_image(const cv::Mat& mask, int inpaintRadius, int method); // 图像修复
	void pyramid_up_image(); // 图像金字塔上采集
	void pyramid_down_image(); // 图像金字塔下采集

	void enhance_image_quality(const std::string& modelPath,
		const std::string& modelName,
		int scale);  // 增强图片画质到更高分辨率
	
	// 信息与显示图片
	void print_image_info();
	int get_image_width() const;
	int get_image_height() const;
	cv::Mat get_image() const;
	void show(const std::string& window_name = "MyPicture");
	static void show_input_image(const std::string& window_name, cv::Mat& image);


private:
	std::string ny_filename = "";
	cv::Mat my_image = cv::Mat();
};


// 测试函数
extern void test_picture();

#endif // MY_PICTURE_H


/*
openCV 图片处理

常见的图像优化技术：
中值滤波（Median Blur）：用于去除噪声，特别适合去除椒盐噪声。它通过计算邻域像素的中值来替换中心像素的值。

高斯模糊（Gaussian Blur）：通过高斯函数对图像进行模糊处理，可以有效去除噪声，同时保留图像边缘。适用于需要平滑图像的场景。

形态学操作（Morphological Operations）：包括膨胀（dilation）和腐蚀（erosion）等操作，可以用于去除噪声、分割图像、连接断开的部分等。

色彩均衡（Color Balancing）：通过调整图像的色彩分量来达到均衡的效果，可以改善图像的视觉效果，使其看起来更加自然。

图像增强（Image Enhancement）：除了直方图均衡化之外，还有对比度限制自适应直方图均衡化（CLAHE）等方法，可以进一步提高图像的对比度和清晰度。

图像分割（Image Segmentation）：将图像分割成多个区域，每个区域由相似的像素组成。常用的方法有阈值分割、k-means聚类、基于边缘的分割等。

边缘检测（Edge Detection）：通过检测图像中的边缘信息，可以突出图像的轮廓和细节。Canny边缘检测器是其中一种常用的方法。

颜色空间转换（Color Space Conversion）：将图像从一种颜色空间转换到另一种颜色空间，有助于图像处理。例如，从BGR转换到HSV有助于颜色均衡和分割。

图像缩放（Image Resizing）：调整图像的大小，可以用于图像预处理，以适应不同的应用场景。

图像旋转（Image Rotation）：旋转图像以达到特定的视觉效果或者对齐。

图像修复（Image Inpainting）：修复图像中的损坏部分或不需要的部分，可以通过克隆或修复算法实现。

图像金字塔（Image Pyramids）：通过构建图像的金字塔结构，可以进行多尺度图像处理，适用于图像压缩、图像配准等场景。
*/
